package cn.tedu.knows.faq.controller;


import cn.tedu.knows.commons.exception.ServiceException;
import cn.tedu.knows.commons.model.Question;
import cn.tedu.knows.faq.service.IQuestionService;
import cn.tedu.knows.faq.vo.QuestionVo;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author tedu.cn
 * @since 2021-05-25
 */
@RestController
@RequestMapping("/v1/questions")
@Slf4j
public class QuestionController {
    @Autowired
    private IQuestionService questionService;

    @GetMapping("/my")
    //从Spring-Security中获得当前登录用户的详情
    //@AuthenticationPrincipal注解表示从Spring-Security中获得
    //当前登录用户,并赋值给紧随其后的参数
    public PageInfo<Question> my(
            @AuthenticationPrincipal UserDetails user,
            Integer pageNum
    ) {
        //所用user对象获得当前登录用户的用户名
        log.debug("当前登录用户名为:{}", user.getUsername());
        if (pageNum == null)
            pageNum = 1;
        Integer pageSize = 8;
        PageInfo<Question> pageInfo = questionService
                .getMyQuestions(user.getUsername(),
                        pageNum, pageSize);
        return pageInfo;

    }

    //  localhost:8080/v1/questions
    @PostMapping("")
    public String createQuestion(
            @Validated QuestionVo questionVo,
            BindingResult result,
            @AuthenticationPrincipal UserDetails user) {
        log.debug("控制权获得新增问题信息:{}", questionVo);
        if (result.hasErrors()) {
            String msg = result.getFieldError()
                    .getDefaultMessage();
            return msg;
        }
        //调用业务逻辑层方法

        questionService.saveQuestion(questionVo,
                user.getUsername());

        return "ok";
    }

    //查询讲师首页问题列表
    @GetMapping("/teacher")
    @PreAuthorize("hasRole('ROLE_TEACHER')")
    public PageInfo<Question> teacher(
            @AuthenticationPrincipal UserDetails user,
            Integer pageNum){
        if(pageNum==null)
            pageNum=1;
        Integer pageSize=8;
        PageInfo<Question> pageInfo=questionService
                .getTeacherQuestions(user.getUsername(),
                        pageNum,pageSize);
        return pageInfo;
    }

    /*
    REST 风格的API
   一般情况下使用get方式请求url
   路径上可以出现具体参数,及使用url进行传值操作
   例如
   /v1/questions/154
   控制器中在154这个位置编写一个占位符例如{id}
   然后再参数位置获取
    */
    //根据问题id获得问题详情的控制器方法
    //    /v1/questions/154
    @GetMapping("/{id}")
    public Question questionDetail(
            @PathVariable Integer id){
        //@PathVariable表示要获得路径上的{}占位符匹配的内容
        //@PathVariable不写不会启动这个功能,所以必须写
        //类型能自动匹配,参数名必须和{}占位符中的内容相同
        if(id==null){
            throw new ServiceException("id不能为空");
        }
        Question question=questionService.getQuestionById(id);
        return question;
    }


    @GetMapping("/count")
    public Integer count(Integer userId){
        return questionService.countQuestionByUserId(userId);
    }

    //分页查询所有问题的Rest接口
    @GetMapping("/page")
    public List<Question> questions(Integer pageNum,
                                    Integer pageSize){
        PageInfo<Question> pageInfo=
                questionService.getQuestions(
                                    pageNum,pageSize);
        return pageInfo.getList();
    }

    //查询按指定pageSize分页获得总页数
    @GetMapping("/page/count")
    public Integer pageCount(Integer pageSize){
        //使用MyBatisPlus提供的方法查询总条数
        int count=questionService.count();
        //根据总条数计算返回总页数
        return  (count+pageSize-1)/pageSize;
    }




}




